from django.shortcuts import render,HttpResponse,redirect
from .models import UserProfile, City
from django.contrib import messages
from django.contrib.auth.hashers import make_password,check_password
import os
from django.contrib.auth import authenticate, login
from .models import NodeData  # 创建NodeData表用来存储Node上传的数据
# from django.http import JsonResponse
import requests  # 用于发送预测请求

# 主页视图，展示项目介绍和登录、注册按钮
def index(request):
    return render(request, 'index.html')

def register(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        confirm_password = request.POST.get('confirm_password')
        user_type = request.POST.get('user_type')
        city_name = request.POST.get('city_name', None)  # 对于NODE用户，获取城市名称

        # 如果 user_type 为空，返回错误信息
        if not user_type:
            messages.error(request, "请选择用户类型。")
            return render(request, 'register.html')

        # 检查密码是否匹配
        if password != confirm_password:
            messages.error(request, "密码不匹配，请重试。")
            return render(request, 'register.html')


        # 检查用户名和用户类型的组合是否已存在
        if UserProfile.objects.filter(username=username, user_type=user_type).exists():
            messages.error(request, "该用户已存在，请选择其他用户名。")
            return render(request, 'register.html')

        # 对于NODE用户，需要关联城市信息
        city = None
        if user_type == 'NODE':
            if not city_name:
                messages.error(request, "请为Node用户选择一个城市。")
                return render(request, 'register.html')
            city, created = City.objects.get_or_create(name=city_name)  # 创建或获取城市

        # 创建用户
        user = UserProfile.objects.create(
            username=username,
            user_type=user_type,
            password=make_password(password),  # 加密密码
            city=city if user_type == 'NODE' else None  # 仅在NODE用户时关联城市
        )
        user.save()

        return redirect('login')

    return render(request, 'register.html')

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_type = request.POST.get('user_type')

        # 确保所有字段都已填写
        if not username or not password or not user_type:
            messages.error(request, "请完整填写所有字段。")
            return render(request, 'login.html')

        # 检查用户名和用户类型是否匹配
        try:
            user = UserProfile.objects.get(username=username, user_type=user_type)
        except UserProfile.DoesNotExist:
            messages.error(request, "用户名或用户类型不存在。")
            return render(request, 'login.html')

        # 检查密码是否正确
        if not check_password(password, user.password):
            messages.error(request, "密码错误，请重试。")
            return render(request, 'login.html')

        # 登录成功后，将用户名和密码存储在 session 中
        request.session['login_account'] = username
        request.session['login_password'] = password
        request.session['user_type'] = user_type  # 可选：存储用户类型
        request.session.save()
        # 登录成功后，重定向到不同的页面
        if user_type == 'CITY':
            return redirect('/City/training')
        elif user_type == 'NODE':
            return redirect('/Node/')

    return render(request, 'login.html')

#还要完成示例文件的下载
def Node(request):
    if request.method == 'POST':
        uploaded_file = request.FILES.get('file')  # 获取上传的文件

        # 验证文件是否存在
        if not uploaded_file:
            messages.error(request, "请上传文件。")
            return redirect('Node')

        # 验证上传文件格式
        if not uploaded_file.name.endswith(('.xls', '.xlsx')):
            messages.error(request, "仅支持 .xls 和 .xlsx 格式的文件。")
            return redirect('Node')

        # 从 session 中获取用户信息
        username = request.session.get('login_account')  # 登录时用户信息保存在 'login_account' 中

        user = UserProfile.objects.get(username=username)

        # 保存文件到数据库 (假设 node_name 使用 username)
        node_data = NodeData.objects.create(
            user=user,  # 使用从 session 获取的用户名
            node_name=username,  # 假设 node_name 是用户名
            file=uploaded_file  # Django 会自动将文件存储到配置的 MEDIA 目录
        )

        # 将文件信息存入 session，方便后续操作
        request.session['uploaded_file_name'] = uploaded_file.name
        request.session['uploaded_file_path'] = node_data.file.url

        # 成功反馈信息
        messages.success(request, "文件上传成功！")
        return redirect('Node')

    return render(request, 'Node.html')  # 显示上传页面

#显示训练结果
def trainingResult(request):
    return  render(request,'trainingResult.html')

#要完成对应Node节点数据的读取，和Node节点预测请求的接收，并完成预测逻辑
def predicting(request):
    return render(request, 'predicting.html')

def predictingMap(request):
    print("Session Data:", request.session.items())
    username = request.session.get('login_account')

    print(f"City Name: {username}")

    context = {
        'city_name': username,
    }

    return render(request, 'predictingMap.html',context)


#完成训练逻辑并传递训练结果给trainingResult页面
def training(request):
    return render(request,'trainingStart.html')

#还要实现判断是否上传数据，以及City是否预测完毕，先判断是否上传数据，再判断City端是否预测完毕，然后根据City端是否预测完毕
#如果预测有结果，则返回该节点结果，如果预测没有结果，则返回暂无预测结果
def NodeInquiry(request):
    error_message = None  # 定义一个初始错误消息变量

    if request.method == 'POST':
        account = request.POST['account']
        password = request.POST['password']

        # 获取存储在 session 中的登录信息
        login_account = request.session.get('login_account')
        login_password = request.session.get('login_password')

        if account == login_account and password == login_password:
            # 获取哪个按钮被点击
            action = request.POST.get('action')

            if action == 'inquiry':
                # 验证当前用户是否已经上传数据（此处是占位逻辑）
                # node_data = NodeData.objects.filter(user=account)
                # if node_data.exists():
                #     return redirect('NodeInquiryResult')  # 跳转到结果页面
                # else:
                #     messages.error(request, '尚未上传数据，请先上传数据。')
                #     return render(request, 'NodeInquiry.html')

                # 暂时模拟成功跳转
                return redirect('NodeInquiryResult')

            elif action == 'predict':
                # 调用预测请求逻辑（假设向 /city/predicting/ 发送请求）
                try:
                    response = requests.post('http://localhost:8000/City/predicting/')
                    if response.status_code == 200:
                        # messages.success(request, '预测请求已成功发送！')
                        error_message = "预测请求已成功发送！"
                    else:
                        # messages.error(request, '预测请求发送失败，请稍后重试。')
                        error_message = "预测请求发送失败，请稍后重试。"
                except Exception as e:
                    # messages.error(request, f'请求错误：{str(e)}')
                    error_message = f"请求错误：{str(e)}"

                # # 返回页面并显示提示信息
                # return render(request, 'NodeInquiry.html',{'error_message': error_message})
        else:
            # 身份验证失败，返回错误消息
            error_message = "账号或密码不匹配，请重新输入。"

        # GET 请求时展示页面
    return render(request, 'NodeInquiry.html', {'error_message': error_message})

#还要完成是否成功预测的逻辑，判断是否能从City/predicting（应该会建一个表存储着每个Node最新的预测结果）取到预测结果
def NodeInquiryResult(request):
    return render(request, 'NodeInquiryResult.html')